﻿using GENERIC.Respository;
using GENERIC.Respository.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace GENERIC.Service.Interfaces
{
    /// <summary>
    /// Interface pour les services d'accès aux données
    /// </summary>
    /// <typeparam name="TEntityType">type d'entité</typeparam>
    public interface IService<TEntityType> : IServiceBase
    {
        /// <summary>
        /// Obtient un ensemble de données correspondant au type d'entité
        /// </summary>
        /// <returns>un ensemble de données correspondant au type d'entité</returns>
        IQueryable<TEntityType> Get();

        /// <summary>
        /// Insertion d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        void Insert(TEntityType entity);

        /// <summary>
        /// Mise à jour d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        void Update(TEntityType entity);

        /// <summary>
        /// Suppression d'une entité
        /// </summary>
        /// <param name="entity">entité</param>
        void Delete(TEntityType entity);

        /// <summary>
        /// Obtenir une collection d'entité
        /// </summary>
        /// <param name="expression">Critère de séléction</param>
        /// <returns>Collection d'entités</returns>
        IQueryable<TEntityType> Get(Expression<Func<TEntityType, bool>> expression);

        /// <summary>
        /// Obtenir une collection d'entité en asynchrone
        /// </summary>
        /// <param name="expression">Critère de séléction</param>
        /// <param name="callback">Collection d'entité</param>
        /// <returns>Résultat</returns>
        bool GetAsync(Expression<Func<TEntityType, bool>> expression, Action<AsyncResponse, IQueryable<TEntityType>> callback);
    }
}
